home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / dviselect / tfm.h < prev    next >
C/C++ Source or Header  |  1989-06-15  |  3KB  |  84 lines

  1. /*
  2.  * Copyright (c) 1987 University of Maryland Department of Computer Science.
  3.  * All rights reserved.  Permission to copy for any purpose is hereby granted
  4.  * so long as this copyright notice remains intact.
  5.  */
  6.  
  7. /*
  8.  * TFM file information.
  9.  */
  10.  
  11. /*
  12.  * TFM files start with a series of unsigned 16 bit integers.  We
  13.  * read this into the structure `tfm_header'.  These are type i32
  14.  * so that they may be used as integer quantities without concern
  15.  * as to sign extension.
  16.  */
  17. struct tfmheader {
  18.     i32    th_lf;        /* length of the file (16 bit words) */
  19.     i32    th_lh;        /* length of the header data (words) */
  20.     i32    th_bc;        /* beginning character */
  21.     i32    th_ec;        /* ending character (inclusive) */
  22.     i32    th_nw;        /* number of words in width table */
  23.     i32    th_nh;        /* number of words in height table */
  24.     i32    th_nd;        /* number of words in depth table */
  25.     i32    th_ni;        /* words in italic correction table */
  26.     i32    th_nl;        /* words in ligature/kern table */
  27.     i32    th_nk;        /* words in kern table */
  28.     i32    th_ne;        /* words in extensible character table */
  29.     i32    th_np;        /* number of font parameter words */
  30. };
  31.  
  32. /*
  33.  * The remainder of the TFM file comprises the following information,
  34.  * all of which are 32 bit quantities:
  35.  *
  36.  * header:    array [0..lh-1] of stuff
  37.  * char_info:    array [bc..ec] of char_info_word
  38.  * width:    array [0..nw-1] of fix_word
  39.  * height:    array [0..nh-1] of fix_word
  40.  * depth:    array [0..nd-1] of fix_word
  41.  * italic:    array [0..ni-1] of fix_word
  42.  * lig_kern:    array [0..nl-1] of lig_kern_command
  43.  * kern:    array [0..ne-1] of extensible_recipie
  44.  * param:    array [0..np-1] of fix_word
  45.  */
  46.  
  47. /*
  48.  * A char_info_word is built of four unsigned eight-bit quantities.  The first
  49.  * is an index into the width table (this saves 24 bits for every
  50.  * character that has the same width as another character).  The
  51.  * second is a composite height and depth index.  The third is a
  52.  * composite italic index and tag, and the fourth is a remainder.
  53.  *
  54.  * XXX needs explaining
  55.  */
  56. struct char_info_word {
  57.     char    ci_width;    /* width index */
  58.     char    ci_h_d;        /* height and depth index */
  59.     char    ci_i_t;        /* italic index and tag */
  60.     char    ci_remainder;    /* ??? */
  61. };
  62.  
  63. /*
  64.  * These macros split up h_and_d and i_and_t values.
  65.  */
  66. #define    T_CI_H(ci) (((ci)->ci_h_d >> 4) & 0xf)
  67. #define    T_CI_D(ci) ((ci)->ci_h_d & 0xf)
  68. #define    T_CI_I(ci) (((ci)->ci_i_t >> 2) & 0x3f)
  69. #define    T_CI_T(ci) ((ci)->ci_i_t & 3)
  70.  
  71. /*
  72.  * This structure contains everything one might need to know about
  73.  * a TFM file at run-time.
  74.  *
  75.  * XXX incomplete, or wrong, as yet
  76.  */
  77. struct tfmdata {
  78.     struct    tfmheader t_hdr;    /* full header */
  79.     struct    char_info_word *t_ci;    /* char info */
  80.     i32    *t_width;        /* widths table */
  81.     i32    *t_height;        /* heights */
  82.     i32    *t_depth;        /* depths */
  83. };
  84.